package fr.blogger.ejb.facade;

import java.util.Calendar;

import javax.ejb.Stateless;
import javax.inject.Named;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.apache.commons.lang3.RandomStringUtils;

import fr.blogger.ejb.model.Utilisateur;
import fr.blogger.ejb.model.Utilisateur_;
import fr.blogger.ejb.outils.enumeration.TypeModificationEnum;

@Named
@Stateless
public class UtilisateurFacade extends AbstractFacade<Utilisateur> {

	public Utilisateur editerUtilisateur(Utilisateur utilisateur, TypeModificationEnum typeModification) {
		switch (typeModification) {
		case creation:
			utilisateur.setDateCreation(Calendar.getInstance().getTime());
			utilisateur.setPassword(RandomStringUtils.randomAlphanumeric(20));
			// TODO : Envoyer un mail
			break;
		default:
			break;
		}
		return update(utilisateur);
	}

	public Utilisateur getUtilisateurByUsername(String mail) {
		try {
			CriteriaQuery query = initQuery();
			Root utilisateur = query.from(entityClass);
			Predicate cond1 = builder().equal(utilisateur.get(Utilisateur_.mail), mail);
			query.where(cond1);
			return (Utilisateur) em.createQuery(query).getSingleResult();
		} catch (Exception e) {
			return null;
		}
	}

	public Utilisateur modificationNombreEchecConnexion(Utilisateur utilisateur, int nombreEchecConnexion) {
		utilisateur.setNombreEchecConnexion(nombreEchecConnexion);
		return update(utilisateur);
	}

	public void modifierDateDerniereConnexion(Utilisateur utilisateur) {
		utilisateur.setDateDerniereConnexion(Calendar.getInstance().getTime());
		update(utilisateur);
	}

	public void reinitialiserToken(Utilisateur utilisateur) {
		utilisateur.setTokenModificationPassword(null);
		update(utilisateur);
	}
}
